package com.example.emos.wx.config.shiro;

import org.springframework.stereotype.Component;

/**
 * @ClassName : ThreadLocalToken
 * @Author : 骆发茂
 * @Date: 2021/10/11 12:22
 * @Description :
 */

@Component//其他类以后可以引用
/*该类是用于在   过滤器和AOP   之间   传递token
 * 使用ThreadLocal，安全的线程*/
/*创建存储令牌的媒介ThreadLocalToken*/
/*之所以需要创建存储令牌的媒介类，是因为后面的filter要使用。*/
/**
 * ThreadLocalToken就像是船一样，船承载着token，（媒介的意思），过滤器拦截了token，需要向AOP中传递token
 * AOP的作用就是向客户端返回新的令牌
 * 但是OAuth2Filter和AOP切面类之间没有调用关系，所以我们很难把新令牌传给AOP切面类。
 * 这里我想到了ThreadLocal，只要是同一个线程，往ThreadLocal里面写入数据和读取数据是完全相同的。
 * 在Web项目中，从 OAuth2Filter到AoP切面类，都是由同一个线程来执行的，中途不会更换线程。
 * 所以我们可以放心的把新令牌保存都在ThreadLocal里面，AOP切面类可以成功的取出新令牌，然后往R对象里面添加新令牌即可。
 *  ThreadLocal类似于船，承载着token，又类似于中转站，将过滤器filter和aop联系在一起
 * ThreadLocalToken是我自定义的类，里面包含了ThreadLocal类型的变量，可以用来保存线程安全的数据，而且避免了使用线程锁。*/
public class ThreadLocalToken_过滤器Filter和AOP之间传递token {
    /**ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突, 线程本地存储是一种自动化机制，
     * 可以为使用相同变量的每个不同线程都创建不同的存储。 @pdai*/
    private ThreadLocal<String> local = new ThreadLocal<>();//泛型string


    /*token设置*/
    //刷新后的令牌获取
    public void setToken(String token) {
        local.set(token);
    }

    /*获取token*/
    public String getToken() {
        return local.get();
    }

    /*清除token*/
    public void clear() {
        local.remove();
    }
}